package colecciones.tests;

import static org.junit.Assert.assertEquals;

import org.junit.Before;
import org.junit.Test;

import colecciones.bloques.BloqueFold;
import colecciones.colecciones.MiColeccion;
import colecciones.colecciones.NoSePuedeFoldearMiColeccionException;


public class ReduceTest {
	private MiColeccion<String> miColeccion;

	@Before
	public void before() {
		this.miColeccion=new MiColeccion<String>().add("h").add("o").add("l").add("a");
	}
	
	@Test
	public void testReduceConValorInicial() {
		assertEquals("Foldear la colecci�n deber�a devolver el String hola", "hola", this.miColeccion.reduce(new BloqueFold<String, String>() {
			@Override
			public String fn(String unaLetra, String cadenaParcial) {
				return cadenaParcial + unaLetra;
			}
		}, ""));
	}

	@Test
	public void testReduceSinValorInicial() {
		assertEquals("Foldear la colecci�n deber�a devolver el String hola", "hola", this.miColeccion.reduce(new BloqueFold<String, String>() {
			@Override
			public String fn(String unaLetra, String cadenaParcial) {
				return cadenaParcial + unaLetra;
			}
		}));
	}
	
	@Test(expected=NoSePuedeFoldearMiColeccionException.class)
	public void testNoSePuedeFoldearUnaColeccionVaciaSinValorInicial() {
		assertEquals("Foldear la colecci�n deber�a devolver el String hola", "hola", new MiColeccion<String>().reduce(new BloqueFold<String, String>() {
			@Override
			public String fn(String unaLetra, String cadenaParcial) {
				return cadenaParcial + unaLetra;
			}
		}));
	}
	
	@Test
	public void testFoldearDeDerechaAIzquierda() {
		assertEquals("Foldear la colecci�n de derecha a izquierda deber�a devolver el String aloh", "aloh", this.miColeccion.reduceRight(new BloqueFold<String, String>() {
			@Override
			public String fn(String unaLetra, String cadenaParcial) {
				return cadenaParcial + unaLetra;
			}
		}));
	}
}
